package com.cj.designpattern.proxy.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * ClassName: CglibProxy <br/>
 * Function: cglib代理 <br/>
 * date: 2018/04/27 15:29 <br/>
 *
 * @author chenj
 * @version 1.0.0
 * @since JDK 1.8
 */
public class CglibProxy<T> implements MethodInterceptor {

    private T t;

    public CglibProxy(T t) {
        this.t = t;
    }

    public T getProxyInstance() {
        /*
        1. 工具类，允许为非接口类型创建一个Java代理。Enhancer动态创建了给定类型的子类但是拦截了所有的方法。
           和Proxy不一样的是，不管是接口还是类他都能正常工作
         */
        Enhancer en = new Enhancer();

        /*
        2. 设置父类
         */
        en.setSuperclass(t.getClass());

        /*
        3. 设置回掉函数(因为MethodInterceptor继承了Callback类,默认执行intercept方法)
         */
        en.setCallback(this);

        /*
        4. 创建子类
         */
        return (T) en.create();
    }

    @Override
    public Object intercept(Object o,
                            Method method,
                            Object[] objects,
                            MethodProxy methodProxy) throws Throwable {
        System.out.println("开始保存...");
        Object returnObject = method.invoke(t, objects);
        System.out.println("保存结束!");
        return returnObject;
    }
}
